package com.example.cachedemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Looper;

public final class BitmapLoader {
    // Bitmap 缓存
    private final BitmapCache cache;

    // 主线程Handler
    private static Handler mainHandler = new Handler(Looper.getMainLooper());


    // 定义单例静态变量
    private volatile static BitmapLoader instance = null;

    // 构造函数私有化
    private BitmapLoader() {
        // 单例，使用全局的context
        this.cache = new BitmapCache(CacheDemoApplication.getContext());
    }

    // 获取单例对象方法
    public static BitmapLoader getInstance() {
        if (instance == null) {
            synchronized (BitmapLoader.class) {
                if (instance == null) {
                    instance = new BitmapLoader();
                }
            }
        }
        return instance;
    }

    // 回调函数
    public interface BitmapLoaderCallback {
        void success(Bitmap bitmap);
        void failure(String message);
    }

    // 加载
    public void loadBitmap(final String imageUrl, final BitmapLoaderCallback callback) {
        // 如果内存中有，从内存中取
        final Bitmap bitmap = cache.getBitmap(imageUrl);
        if (bitmap != null) {
            mainHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (callback != null) {
                        callback.success(bitmap);
                    }
                }
            });
            return;
        }
        // 内存中没有，需要下载，这个过程耗时比较长，放子线程中执行
        ThreadUtil.fixed(new Runnable() {
            @Override
            public void run() {
                // 下载并写入磁盘缓存
                boolean isOk = cache.downloadUrlToDiskCache(imageUrl);
                if (!isOk) {
                    mainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            if (callback != null) {
                                callback.failure("下载并缓存图片失败，url：" + imageUrl);
                            }
                        }
                    });
                    return;
                }
                // 下载完成后，再从缓存中读一次，从磁盘缓存读入到内存缓存
                final Bitmap bitmapFromNetwork = cache.getBitmap(imageUrl);
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (callback != null) {
                            if (bitmapFromNetwork != null) {
                                callback.success(bitmapFromNetwork);
                            } else {
                                callback.failure("获取图片失败，url:" + imageUrl);
                            }
                        }
                    }
                });
            }
        });
    }

    /**
     * 缓存大小信息
     * @return  信息字符串，Kb
     */
    public String size() {
        return cache.size();
    }

    /**
     * 删除指定图片
     * @param imageUrl  图片的url
     */
    public void removeImage(String imageUrl) {
        cache.removeImage(imageUrl);
    }

    /**
     * 清空缓存
     */
    public void clear() {
        cache.clear();
    }

    /**
     * 仅磁盘缓存在某些情况下需要，比如进入后台
     */
    public void flush() {
        cache.flush();
    }
}
